﻿using System.Data;
using System.Data.SqlClient;
using System;
using System.Windows.Forms;
using ServerPA.CompletPort.Util;

namespace HandleSign.DataBase.Base
{
    /// <summary>
    /// 此类封装SqlServer数据库的一些操作
    /// </summary>
    /// 
    class DataBaseDao
    {
        SqlConnection con;
        
        public DataBaseDao(string conn)
        {
            con = new SqlConnection(conn);
            //try
            //{
            //    if (con.State == ConnectionState.Closed)
            //    {
            //        con.Open();
            //    }
            //}
            //catch (Exception ex)
            //{
            //    LogUtil.LogToFile(ex, this.GetType().Name);
            //   //  MessageBox.Show(ex.Message);
            //}
        }



        public void CheckSqlConnection()
        {
            try
            {
                if (con.State == ConnectionState.Closed)
                {
                    con = new SqlConnection(Form1.connstr);
                    con.Open(); 
                }
            }
            catch (Exception ex)
            {
                LogUtil.LogToFile(ex, this.GetType().Name);
                //  MessageBox.Show(ex.Message);
            }
        }
         

        /// <summary>
        /// 此query方法查询表的内容并返回，为一些控件提供数据源
        /// </summary>
        /// <param name="sql">为此方法提供sql语句时，应该提供只执行查询操作的sql，其他类型的就没有意义</param>
        /// <returns></returns>
        public DataTable Query(string sql, string tableName)
        {
            SqlDataAdapter adapter = new SqlDataAdapter(sql, con);
            DataSet ds = new DataSet();
            try
            {
                adapter.Fill(ds, tableName);
            }
            catch (Exception ex)
            {
                LogUtil.LogToFile(ex, this.GetType().Name);
               // MessageBox.Show(ex.Message);
            }
            //adapter.Fill(ds, tableName);
            return ds.Tables[0];
        }

        /// <summary>
        /// 此query方法直接返回一个DataTable对象，其他与上一个函数一样
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public DataTable Query_dt(string sql)
        {
            //XXXAdapter
            SqlDataAdapter adapter = new SqlDataAdapter(sql, con);
            //XXXCommandBuilder暂时不清楚具体作用
            DataTable dt = new DataTable();
            try
            {
                adapter.Fill(dt);
            }
            catch (Exception ex)
            {
                LogUtil.LogToFile(ex, this.GetType().Name);
            }
            return dt;
        }

        /// <summary>
        /// 对于查询结果，给定行号、列名，返回该行该列
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public string Query(string sql, int row, string column)
        {
            string result = "";
            SqlDataAdapter adapter = new SqlDataAdapter(sql, con);
            //XXXCommandBuilder暂时不清楚具体作用
            DataTable dt = new DataTable();
            adapter.Fill(dt);
            if (dt.Rows.Count > row) {

                result = dt.Rows[row][column].ToString();
            }
            return result;     //行号确定，返回指定列有三种方法：列名+列号+DataColumn对象（暂时不明）


        }

        /// <summary>
        /// 主要用于更新数据，（返回0表示失败）
        /// </summary>
        public long Execute(string sql)
        {
            SqlCommand scmd = new SqlCommand(sql, con);

            long Result = 0;
            try
            {
                Result = scmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                LogUtil.LogToFile(ex, this.GetType().Name);
                //MessageBox.Show(ex.Message);
            }

            return Result;

            //return scmd.ExecuteNonQuery();
        }


        /// <summary>
        /// 主要用于更新数据
        ///  每次执行都要关闭，防止连接过多。
        /// </summary>
        public long Execute(string sql, string connStr)
        {
            long Result = 0;
            
                SqlConnection conn = new SqlConnection(connStr);
                SqlCommand scmd = new SqlCommand(sql, conn);
            try
            {
                conn.Open();
                Result = scmd.ExecuteNonQuery();
                conn.Close();
            }
            catch (Exception ex)
            {
                conn.Close();
                LogUtil.LogToFile(ex, this.GetType().Name);
                //MessageBox.Show(ex.Message);
            }
            return Result;
            //return scmd.ExecuteNonQuery();
        }


        /// <summary>
        /// 如果要执行这种操作的表中没有设置主键，则不能用这种方法
        /// </summary>
        /// <param name="sql"></param>
        public void Delete(string sql)
        {
            SqlDataAdapter adapter = new SqlDataAdapter(sql, con);
            DataTable dt = new DataTable();
            //adapter.Fill(dt);
            try
            {
                adapter.Fill(dt);
                dt.Rows[dt.Rows.Count - 1].Delete();
                adapter.Update(dt);
            }
            catch (Exception ex)
            {
                LogUtil.LogToFile(ex, this.GetType().Name);
               // MessageBox.Show(ex.Message);
            }
            
        }


        /// <summary>
        /// 存储过程的使用
        /// sql ————> 存储过程名
        /// </summary>
        /// <returns></returns>
        public DataTable ExecSP(string sql, string Rsd_Data, string Rsd_Phone, string Rsd_SignDock)
        {
            SqlCommand comStr = new SqlCommand(sql, con);//SQL语句执行对象，第一个参数是要执行的语句，第二个是数据库连接对象  
            comStr.CommandType = CommandType.StoredProcedure;//因为要使用的是存储过程，所以设置执行类型为存储过程  

            //依次设定存储过程的参数  
            comStr.Parameters.Add("@Rsd_Data", SqlDbType.Text).Value = Rsd_Data;
            comStr.Parameters.Add("@Rsd_Phone", SqlDbType.Text).Value = Rsd_Phone;
            comStr.Parameters.Add("@Rsd_SignDock", SqlDbType.Text).Value = Rsd_SignDock;
            //con.Open();//打开数据库连接   
            SqlDataAdapter SqlDataAdapter = new SqlDataAdapter(comStr);
            DataTable dt = new DataTable();
            try
            {
                SqlDataAdapter.Fill(dt);
            }
            catch (Exception ex)
            {
                LogUtil.LogToFile(ex,this.GetType().Name);
               // MessageBox.Show(ex.Message);
            }
            
            //SqlDataAdapter.Fill(dt);
            return dt;
        }


        public void Dispose()
        {
            try
            {
                con.Close();
                con.Dispose();
            }
            catch (Exception ex)
            {
                LogUtil.LogToFile(ex, this.GetType().Name);
               // MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// 必须显示地在代码中强制关闭数据库的连接，一般就应该在代码中再次显示调用上面的Dispose方法
        /// </summary>
        ~DataBaseDao()
        {
            try
            {
                //con.Close();
                //con.Dispose();
            }
            catch (Exception ex)
            {
                LogUtil.LogToFile(ex, this.GetType().Name);
               // MessageBox.Show(ex.Message);
            }

        }
    }
}
